package org.core.tliaswebmanagement.aop;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

@Slf4j
//@Aspect
@Component
public class RecordTimeAspect {

    /*
     * 切面：记录方法执行耗时,记录的方法为  org.core.tliaswebmanagement.service.impl包下的所有类的所有方法，形参任意
     *
     * 连接点：JointPoint, 可以被AOP控制的方法，不一定是切入点
     * 通知：Advice, 通知为切面所执行的代码,仅在切面所拦截的方法上执行
     * 切入点：PointCut, 切入点为切面所拦截的方法的匹配规则,一定是连接点
     * 切面：Aspect, 切面为切面所定义的切入点、通知之间的逻辑关系
     * 目标对象：Target, 通知所应用的对象
     *
     * Spring AOP底层是基于动态代理实现的
     * AOP代理对象：Proxy, 代理对象为Spring AOP底层所创建的代理对象，然后实现的目标对象所实现的接口，然后在方法中将通知和原始操作组合并执行
     */
    @Around("execution(* org.core.tliaswebmanagement.service.impl.*.*(..))")
    public Object recordTime(ProceedingJoinPoint pjp)throws Throwable{
        Long begin=System.currentTimeMillis();
        Object result=pjp.proceed();
        long end=System.currentTimeMillis();
        log.info("方法{}执行耗时：{}ms",pjp.getSignature(),end-begin);
        return result;
    }

}
